package domain.controller;

import data_source.DAO.jdbc.ConsultaDAO;
import data_source.DAO.jdbc.MedicoDAO;
import data_source.DAO.jdbc.PacienteDAO;
import domain.pojo.Consulta;
import domain.pojo.Medico;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.DefaultException;

/**
 * Controlador de consultas
 * @author Owner
 */
public class ConsultaController {
    ConsultaDAO modelo = null;
    
    /**
     * Construtor
     */
    public ConsultaController(){
	modelo = new ConsultaDAO();
    }
    
    /**
     * Pega a quantidade de consultas finalizadas
     * @return quantidade de consultas finalizadas
     */
    public int getQuantidadeFinalizados(){
	return modelo.getQuantidadeNao();
    }
    
    /**
     * Pega a quantidade de consultas pertencentes à um médico
     * @param id id do médico
     * @return quantidade de consultas do médico
     */
    public int getQuantidadeConsultasMedico(int id){
	return modelo.getQuantidadeConsultasMedico(id);
    }
    
    /**
     * Pega as consultas não finalizadas
     * @param quantidade número de consultas não finalizadas
     * @return matriz com os nome do médico e do paciente de cada consulta não finalizada
     */
    public Object[][] getNaoFinalizados(int quantidade){
	Object[][] data = modelo.consultaTodosNaoFinalizados(quantidade);
	return transforma(data,quantidade);
    }
    
    /**
     * Pega as consultas não finalizadas de um médico específico
     * @param quantidade quantidade de consultas não finalizadas de um médico
     * @param id id do médico
     * @return matriz com os nomes do médico e dos pacientes cujas consultas não foram finalizadas
     */
    public Object[][] getNaoFinalizadosMedico(int quantidade, int id){
	Object[][] data = modelo.consultaTodosNaoFinalizadosMedico(quantidade, id);
	return transforma(data,quantidade);
    }
    
    public String[] getConsultasFromMedico(Medico medico){
	PacienteController pc = new PacienteController();
	List<Consulta> lista = modelo.getConsultasFromMedico(medico.getId());
	String[] aux = new String[lista.size()+1];
	aux[0] = "No. Nome\tFinalizado?\n";
	for(int i = 0; i < lista.size(); i++){
	    aux[i+1] = (i+1)+". " ;
	    aux[i+1] += pc.getNomeFromId(lista.get(i).getPaciente().getId());
	    aux[i+1] += "\t";
	    aux[i+1] += lista.get(i).getFinalizado() == 1 ? "SIM" : "NÃO";
	    aux[i+1] += "\n";
	}
	
	return aux;
    }
    
    public String[] getConsultasFromEspecialidade(String espec){
	PacienteController pc = new PacienteController();
	MedicoController mc = new MedicoController();
	List<Consulta> lista = transforma(modelo.getConsultasFromEspecialidade(espec));
	String[] aux = new String[lista.size()+1];
	aux[0] = "No.\tNome Médico\tNome Paciente\tFinalizado?\n";
	for(int i = 0; i < lista.size(); i++){
	    aux[i+1] = (i+1)+".\t" ;
	    aux[i+1] += mc.getNomeFromId(lista.get(i).getMedico().getId())+"\t";
	    aux[i+1] += pc.getNomeFromId(lista.get(i).getPaciente().getId())+"\t";
	    aux[i+1] += lista.get(i).getFinalizado() == 1 ? "SIM" : "NÃO";
	    aux[i+1] += "\n";
	}
	return aux;
    }
    
    /**
     * Exclui consulta do banco de dados
     * @param codigo código da consulta a ser excluída
     */
    public void excluir(String codigo){
	try {
	    modelo.excluir(codigo);
	} catch (DefaultException ex) {
	    Logger.getLogger(ConsultaController.class.getName()).log(Level.SEVERE, null, ex);
	}
    }
    
    /**
     * Atualiza dados da consulta do banco de dados
     * @param consulta consulta a ser atualizada
     */
    public void atualizar(Consulta consulta){
	try {
	    modelo.atualizar(consulta);
	} catch (DefaultException ex) {
	    Logger.getLogger(ConsultaController.class.getName()).log(Level.SEVERE, null, ex);
	}
    }
    
    /**
     * Inclui de consulta
     * @param consulta consulta a ser incluída
     */
    public void incluir(Consulta consulta){
	try {
	    modelo.incluir(consulta);
	} catch (DefaultException ex) {
	    Logger.getLogger(ConsultaController.class.getName()).log(Level.SEVERE, null, ex);
	}
    }
    
    /**
     * Finaliza consulta no banco de dados
     * @param consulta consulta a ser finalizada
     */
    public void finalizarConsulta(Consulta consulta){
	try {
	    modelo.finalizar(consulta);
	} catch (DefaultException ex) {
	    Logger.getLogger(ConsultaController.class.getName()).log(Level.SEVERE, null, ex);
	}
    }

    /**
     * Verifica se existe uma consulta
     * @param idP id do paciente
     * @param idM id do médico
     * @return true se existe a consulta, false se não
     */
    public boolean existeConsulta(int idP, int idM){
	return modelo.existeConsulta(idP, idM);
    }
    
    private Object[][] transforma(Object[][] data, int qtd){
	MedicoDAO md = new MedicoDAO();
	PacienteDAO pd = new PacienteDAO();
	
	qtd--;
	while(qtd >= 0){
	    data[qtd][1] = pd.getNomeFromID(data[qtd][1].toString());
	    data[qtd][2] = md.getNomeFromID(data[qtd][2].toString());
	    qtd--;
	}
	return data;
    }
    
    private List<Consulta> transforma(List<Consulta> data){
	MedicoDAO md = new MedicoDAO();
	PacienteDAO pd = new PacienteDAO();
	int i = 0;
	
	while(i < data.size()){
	    data.get(i).getMedico().setNome(md.getNomeFromID(String.valueOf(data.get(i).getMedico().getId())));
	    data.get(i).getPaciente().setNome(pd.getNomeFromID(String.valueOf(data.get(i).getPaciente().getId())));
	    i++;
	}
	return data;
    }
}
